Парсерные функции
Парсерные функции в ТОМ2 используются при анализе и выполнении команд на
естественном языке. В отличие от других языков, парсерные функции не имеют имён и
вызываются исключительно по аргументам. Дай мяч Маше
Функции являются программируемыми комбинаторами.
В отличии от встроенных системных комбинаторов, работа функций на каждом этапе
парсинга тонко настраивается с помощью описания аргументов и кода функции. Типы парсерных функции
Cуществует три типа функций: Конструктор функцииКонструктор функции имеет следующий синтаксис:
< fn_type > ( < type > [arg_name][#key][, < type > [arg_name][#key][, ...]])
{
[общий код]
[--parsing | парсинг--]
[код секции]
[--check | проверка--]
[код секции]
[--execute | выполнение--]
[код секции]
}
Где: Тип аргументаТип аргумента влияет на подбор значений на роль аргумента функции. В качестве типа может быть указано одно из следующего: Тип значения: bool, string, number, course, spcvalue, object, attribute, class, location, word, preposition, and-list, or-list. Класс значения. Пример: "предмет "существо"и т.п. Имя объекта. Для объектных значений, имеющих имена, в качестве типа можно указывать имя конкрет- ного объекта. Произвольный литерал - должен в точности совпасть со словом, введенным игроком. Пример: "трах-тибидох" Имя аргументаЕсли имя переменной не указано, значение в функцию не передаётся, но по-прежнему влияет на подбор функций. Ключ аргументаПример: #ВпЕч Здесь значение должно находиться в винительном падеже единственного числа. В состав ключа могут входить шаблоны ’ !’ и ’*’. * - подходит любое свойство ключа; ! - в ключе не должно быть указанного свойства. Пример: #*п!е Здесь у значения должен быть любой падеж, и не должно быть отрицания. Если ключ не указан, проверка значения на соответствие ключу не проводится. Общий кодМесто от начала тела функции до начала первой секции идеально подходит для объявления переменных и вычисления значений, необходимых внутри других секций. Общий код не является обязательным. Секция parsing | парсинг
Во всех типах функций эта секция вызывается на этапе построения синтаксического дерева команды из командной строки или строки кода.
Секция вызывается после подбора и проверки аргументов на соответствие типу и ключу, указанным в описании функции.
Секция может вызываться многократно для различных комбинаций аргументов. Секция check | проверкаСекция check используется в типах функций действие (action) и факт (fact), но используется по-разному. Смотрите соответствующий раздел документации. Секция execute | выполнениеСекция execute используется во всех 3х типах функций, но везде по-разному. Смотрите соответствующий раздел документации. Сообщения об ошибках в секциях функцийТОМ в процессе парсинга оперирует вариантными значениями. Каждый вариант имеет свой вес. Если в результате разбора получилось несколько значений с различными весами, выбор делается в пользу самого весомого. Это же относится и к формированию ошибок. Вес ошибки зависит от секции, в которой она возникла. Ошибки в секции ==parsing== весят меньше чем ошибки в секции ==check==. То есть при выборе между ==parsing== ошибка, "фраза не согласована по падежам" и ==check== ошибка, "этот ключ не подходит к двери" будет показана последняя ошибка. Смотрите такжеДействие, Выражение, Факт, Принцип работы парсера |
to do: Проверить корректность. Добавить примеры. Дополнить. |